import operator
import time
import calendar

# 知识点:
# 1.


# 第二节
# 2.1 条件语句
# Python程序语言指定任何非0和非空（null）值为true，0 或者 null为false。
# if "判断条件"成立时（非零），则执行后面的语句，而执行内容可以多行，以缩进来区分表示同一范围。
print("---------条件语句--------")
var = 100
if var == 100: print("变量 var 的值为100")
print("Good bye!")

#  while
numbers = [12, 37, 5, 42, 8, 3]
even = []
odd = []
while len(numbers) > 0:
    number = numbers.pop()
    if number % 2 == 0:
        even.append(number)
    else:
        odd.append(number)
print("even =" + str(even))
print("odd =" + str(odd))

#   for循环的语法格式如下：
#  for iterating_var in sequence:
#    statements(s)
# 实例
for letter in 'Python':
    print('当前字母 :', letter)
#     循环嵌套
# for iterating_var in sequence:
#    for iterating_var in sequence:
#       statements(s)
#    statements(s)

province1 = [" 济南", "青岛", "菏泽"]
province2 = [" 海淀", "朝阳", "通州"]
province3 = [" 太原", "榆次", "临汾"]
country = [province1, province2, province3]
for province in country:
    for city in province:
        print(" city:" + str(city))

# break 语句
# TODO
# continue 语句
# TODO

# pass 语句
# Python pass 是空语句，是为了保持程序结构的完整性。
# pass 不做任何事情，一般用做占位语句
# TODO

# 转义字符
# TODO


# 三引号
# python中三引号可以将复杂的字符串进行复制
# TODO

# 2.2
# 列表(List)
print("-------------list------------")
# 列表 遍历
list2 = [1, 2, 3, 4, 5, 6, 7]
print("list2[1:5]: ", list2[1:5])

# 更新list
list3 = []  ## 空列表
list3.append('Google')  # 使用 append() 添加元素
list3.append('Runoob')
list3.append('apple')
print(list3)
# 删除列表元素

list4 = ["海淀", "朝阳", "通州", "昌平", "延庆", "大兴"]
print(list4)
del list4[1]
print(list4)

# 列表脚本操作符
# 表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表，* 号用于重复列表。
# TODO
# 列表函数&方法 总结
list5 = [56, 12, 26, 37, 68, 3]
list6 = [56, 12, 26, 37, 68, 3]
list7 = [6, 2, 6, 7, 8, 13]
# 1. list 比较
# cmp(list1, list2) 比较两个列表的元素 ==> 已经废弃 使用operator 替代

print("list5  list6 eq =", operator.eq(list5, list6))  # 相当于 a == b
print("list5  list6 eq =", operator.le(list5, list6))  # 相当于 a <= b
print("list5  list6 eq =", operator.lt(list5, list6))  # 相当于 a < b
print("list5  list6 eq =", operator.ne(list5, list6))  # 相当于 a != b
print("list5  list6 eq =", operator.gt(list5, list6))  # 相当于 a > b
print("list5  list6 eq =", operator.ge(list5, list6))  # 相当于 a >= b
# 2.
# len(list) 列表元素个数
print("list5 length =", len(list5))
# 3.
# max(list)  返回列表元素最大值
print("list5 max =", max(list5))
# 4.
# min(list) 返回列表元素最小值
print("list5 min =", min(list5))
# 5.
# list(seq)  将元组转换为列表

# 6.
# list.append(obj) list 添加,在列表末尾添加新的对象

# 7.
# list.count(obj)  统计某个元素在列表中出现的次数
print("元素 6 的个数 in list  =", list7.count(6))
# 8.
# list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值（用新列表扩展原来的列表）
list5.extend(list7)
print("合并的 list5  =", list5)

# 9.
# list.index(obj) 从列表中找出某个值第一个匹配项的索引位置 即返回某个元素的角标
print(" 通州的 index  =", list4.index("通州"))

# 10.
# list.insert(index, obj) 将对象插入列表

# 11.
# list.pop([index=-1])  移除列表中的一个元素（默认最后一个元素），并且返回该元素的值

# 12.
# list.remove(obj) 移除列表中某个值的第一个匹配项
list5.remove(6)
print("删除元素 6 后的 list5  =", list5)
# 13.
# list.reverse() 反向列表中元素 ,即将 list 倒序
list5.reverse()
print("倒序后的 list5  =", list5)

# 14.
# list.sort(cmp=None, key=None, reverse=False) 对原列表进行排序
list5.sort()
print("sort后的 list5  =", list5)

# 2.3 Python 元组
# Python的元组与列表类似，不同之处在于元组的元素不能修改。 即元组 的元素只可以读 不可以写.
# 元组使用小括号，列表使用方括号。
# 元组创建很简单，只需要在括号中添加元素，并使用逗号隔开即可
print("------------tup-------------")
# 元组中只包含一个元素时，需要在元素后面添加逗号 ,不然 貌似就成了 String 了
tup = (23,)
print("tup ==", tup)

# 遍历元组

tup1 = ("海淀", "朝阳", "通州", "昌平", "延庆", "大兴")
print("tup1[3]: ", tup1[3])  # 输出角标为 3 的元素
print("tup1[2:5]: ", tup1[2:5])  # 包含角标 2 的元素,不包含角标 5 的元素

# 修改元组
# 元组中的元素值是不允许修改的，但我们可以对元组进行连接组合
tup2 = ("十里堡", "石佛营", "青年路")
resTup = tup1 + tup2
print("合并之后的 resTup", resTup)

# 删除元组
# 元组中的元素值是不允许删除的，但我们可以使用del语句来删除整个元组
del resTup
# 以上实例元组被删除后，输出变量会有异常信息, 验证时候可以打开注释
# print("After deleting resTup :", resTup)

# 元组内置函数
# 1.
# len(tuple) 计算元组元素个数
# 2.
# max(tuple)  返回元组中元素最大值

# 3.
# min(tuple) 返回元组中元素最小值

# 4.
# tuple(seq) 将列表转换为元组

# 2.4 字典(Dictionary)
# 字典是另一种可变容器模型，且可存储任意类型对象。
#
# 字典的每个键值 key=>value 对用冒号 : 分割，每个键值对之间用逗号 , 分割，整个字典包括在花括号 {} 中 ,格式如下所示：
# d = {key1 : value1, key2 : value2 }

print("------------Dictionary-------------")

# 遍历字典
dict1 = {"name": "bench", "age": "23", "tel": 136088888, "address": "北京", "height": 180}
print("dict1= ", dict1)
#  遍历 key
print("dict1 keys= ", dict1.keys())
#  遍历 values
print("dict1 values= ", dict1.values())

print("dict1 里的name", dict1["name"])

#  修改字典的value 值
dict1["age"] = 28
dict1["address"] = "朝阳"

print("dict1 修改后的 values= ", dict1.values())

# 删除字典元素
dict2 = {"name": "grape", "age": "1", "tel": 888, }

del dict2['name']  # 删除键是'name'的条目
print("dict2= ", dict2)
dict2.clear()  # 清空字典所有条目
print("dict2= ", dict2)
del dict2  # 删除字典

# 字典键的特性
# 两个重要的点需要记住：
# 1.不允许同一个键出现两次。创建时如果同一个键被赋值两次，后一个值会被记住
dict3 = {"name": "grape", "age": "10", "age": 1, }
print("dict3= ", dict3)
# 2.键必须不可变，所以可以用数字，字符串或元组充当，所以用列表就不行


# 字典内置函数&方法
# 1.
# len(dict) 计算字典元素个数，即键的总数

print("dict1 len  ", len(dict1))

# 2.
# str(dict) 输出字典可打印的字符串表示
print("dict1 输出为 str  ", str(dict1))

# 3 .
# type(variable) 返回输入的变量类型，如果变量是字典就返回字典类型
print("dict1 type  ", type(dict1))

# 4.
# dict.clear() 删除字典内所有元素

# 5.
# 	dict.copy() 返回一个字典的浅复制

# 6.
# dict.fromkeys(seq[, val])  创建一个新字典，以序列 seq 中元素做字典的键，val 为字典所有键对应的初始值

# 7.
# dict.get(key, default=None)  返回指定键的值，如果值不在字典中返回default值

# 8.
# dict.has_key(key)  如果键在字典dict里返回true，否则返回false

# 9.
# dict.items() 以列表返回可遍历的(键, 值) 元组数组

# 10.
# dict.keys() 以列表返回一个字典所有的键

# 11.
# dict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中，将会添加键并将值设为default

# 12.
# 	dict.update(dict2) 把字典dict2的键/值对更新到dict里

# 13.
# dict.values() 以列表返回字典中的所有值

# 14.
# pop(key[,default]) 删除字典给定键 key 所对应的值，返回值为被删除的值。key值必须给出。 否则，返回default值

# 15.
# popitem() 随机返回并删除字典中的一对键和值

#  2.5 Python 日期和时间
# Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间
# 时间间隔是以秒为单位的浮点小数。
# 每个时间戳都以自从1970年1月1日午夜（历元）经过了多长时间来表示
# 使用时候需要导包 import time;  # 引入time模块
print("-----------日期和时间---------")
ticks = time.time()
print("当前时间戳为:", ticks)

#
localtime = time.localtime(time.time())
print("本地时间为 :", localtime)

# 最简单的获取可读的时间模式的函数:asctime()
localtime = time.asctime(time.localtime(time.time()))
print("本地时间为 :", localtime)

# 格式化日期
# 函数:time.strftime()
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

print(time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))

# 将格式字符串转换为时间戳
# 函数:mktime()
a = "Fri Sep  6 19:26:14 2019"
print(time.mktime(time.strptime(a, "%a %b %d %H:%M:%S %Y")))  # 输出:1567769174.0

# python中时间日期格式化符号：
# %y 两位数的年份表示（00-99）
# %Y 四位数的年份表示（000-9999）
# %m 月份（01-12）
# %d 月内中的一天（0-31）
# %H 24小时制小时数（0-23）
# %I 12小时制小时数（01-12）
# %M 分钟数（00=59）
# %S 秒（00-59）
# %a 本地简化星期名称
# %A 本地完整星期名称
# %b 本地简化的月份名称
# %B 本地完整的月份名称
# %c 本地相应的日期表示和时间表示
# %j 年内的一天（001-366）
# %p 本地A.M.或P.M.的等价符
# %U 一年中的星期数（00-53）星期天为星期的开始
# %w 星期（0-6），星期天为星期的开始
# %W 一年中的星期数（00-53）星期一为星期的开始
# %x 本地相应的日期表示
# %X 本地相应的时间表示
# %Z 当前时区的名称
# %% %号本身

# Time 包含的内置函数
# TODO

# 获取某月日历

cal = calendar.month(2019, 9)
print("以下输出2016年1月份的日历:", cal)


# Calendar包含了以下内置函数
# TODO
